<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
<title>debug指令详解</title>
</head>

<body background="../index.files/back_bluh.jpg">

<p><font size="5" color="#3366FF"><b>debug指令详解</b></font><br>
<br>
<br>
<br>
一、DEBUG概述&nbsp;<br>
<br>
DEBUG是在DOS状态下面供程序员使用的程序调试工具。它可以用来检查内存中任何地址中的内容以及修改特定地址中的内容。DEBUG还可以用于逐指令执行某个程序，追踪程序的执行过程，比较一条指令执行前后数值变化情况，读写文件与磁盘扇区。此外，DEBUG还可以用于读写端口中的数值。&nbsp;<br>
<br>
在DEBUG状态下，所有数据都作为字节序列，可以用DEBUG把任何类型的文件读入内存中。DEBUG能够处理的数据为两种: 十六进制数和ASCⅡ码，使用两位数表示十六进制数据（0~9，A~F）。在DEBUG中涉及内存中的数据时，要指定数据所在的内存单元的地址，地址的输入格式是: [段地址]: [位移]。如果没有输入地址，DEBUG将假定为当前内存段，从位于地址100H的字节开始。前100H字节保留给程序段前缀使用（称PSP结构，包含程序执行的各种信息），该区域用于建立DOS与程序之间的联系。在DEBUG中，使用四位十六进制数表示地址（0~9，A~F）。<br>     
    DEBUG输入数据时有两种方法: 提示方法和非提示方法。在提示方法下，输入要求输入数据的命令，后跟保存数据的地址。执行后可以看到该地址中已有的内容及一个冒号提示符。此时可以在提示符下输入一个新的值或者按下回车键或CTRL+C回到“―”提示符。在非提示方法下，输入保持数据的内存地址以及要输入的数据。 DEBUG的启动： 进入DOS状态下，键入DEBUG &#8207;，按ENTER键，如： C:\>DEBUG &#8207;，则屏幕显示： －&nbsp;<br>    
<br>
符号“－”是进入DEBUG的提示符，在该提示符下可键入任意DEBUG命令。&nbsp;<br>
<br>
       DEBUG的退出：&nbsp;<br>
<br>
在DEBUG的提示符后输入Q命令，按ENTER键，则退出DEBUG返回DOS。&nbsp;<br>
<br>
       DEBUG的使用：&nbsp;<br>
<br>
在DEBUG的提示符后输入DEBUG命令，按ENTER键。&nbsp;<br>
<br>
二、DEBUG 命令详解&nbsp;<br>    
<br>
<br>
★  A命令&nbsp;<br>    
<br>
格式：A[地址]&nbsp;<br>
功能：将指令直接汇编成机器码输入到内存中。&nbsp;<br>
<br>
参数说明：[地址]指定存放键入汇编语言指令的内存单元的位置。<br>
★  C命令&nbsp;<br>    
<br>
格式：C[源地址范围][目的地址]&nbsp;<br>
功能：比较两内存区域中的内容是否相同。若不同则按字节显示其地址和内容，若相同则不显示任何内容。&nbsp;<br>
<br>
参数说明：[源地址范围]指定要比较的内存第一个区域的起始和结束地址，或起始地址和长度。[目的地址] 指定要比较的第二个内存区域的起始地址。<br>     
★  D命令&nbsp;<br>    
<br>
格式：D[地址] 或D[起始地址][目的地址]&nbsp;<br>    
功能：以内存映象方式显示内存中的数据。 参数说明：指定要显示内容的内存单元的起始地址和结束地址，或起始地址和长度。如果不指定 [地址]，Debug将从以前 d 命令中所指定的地址范围的末尾开始显示 128个字节的内容；第一次从DS:100处开始显示。<br>     
★  E命令&nbsp;<br>    
<br>
格式：E[地址] [字节串] 或E[地址]<br>     
功能：从指定的地址开始修改内存值。 参数说明：[地址]指定存放[字节串]第一个内存的位置，[字节串]是要放入内存单元中的数据。&nbsp;<br>    
<br>
★  F命令&nbsp;<br>    
<br>
格式：F[地址范围] [字节或字节串]&nbsp;<br>    
功能：将要填写的字节或字节串填入由地址范围指定的存储器中。&nbsp;<br>
<br>
参数说明：[地址范围]指定要填充内存区域的起始和结束地址，或起始地址和长度。[字节或字节串] 指定要输入的数据，可以由十六进制数或引号包括起来的字符串组成。<br>     
★  G命令&nbsp;<br>    
<br>
格式：G[=起始地址] [[断点]……]&nbsp;<br>    
功能：执行正在调试的程序，当达到断点时停止执行， 并且显示寄存器标志和下一条要执行的命令。 参数说明：[=起始地址]指定当前在内存中要开始执行的指令所在的内存单元的地址。如果不指定[=起始地址]，DEBUG将从 CS:IP 寄存器中的当前地址开始执行程序。[[断点]……]       指定可以设置为 g 命令的部分的 1 到 10 个临时断点。<br>     
★  H命令&nbsp;<br>    
<br>
格式：H[数值][数值]&nbsp;<br>
功能：分别显示两个十六进制数相加的和以及第一个数减去第二个数的差。&nbsp;<br>
<br>
参数说明：[数值]表示从 0 到 FFFFh 范围内的任何十六进制数字。&nbsp;<br>    
<br>
★   I命令&nbsp;<br>    
<br>
格式：I[端口地址]<br>
功能：从指定的端口输入并显示(用十六进制)指定端口中的数据（字节）。 参数说明：[端口地址]指定要读取数据的端口地址。<br>     
★ L命令&nbsp;<br>    
<br>
格式：L[地址][盘号:][逻辑扇区号][扇区数]<br>
功能：将一个文件或盘的绝对扇区装入存储器。&nbsp;<br>
<br>
参数说明：[地址] 指定要在其中加载文件或扇区内容的内存空间的起始位置。[盘号:] 指定包含读取指定扇区的磁盘的驱动器。该值是数值型，表示为：0 = A, 1 = B, 2 = C，…… 等。[逻辑扇区号] 指定要加载其内容的第一个扇区的十六进制数。 [扇区数] 指定要加载其内容的连续扇区的十六进制数。<br>     
★  M命令&nbsp;<br>    
<br>
格式：M[地址范围][起始地址]<br>
功能：把地址范围内的存储器单元的内容移到起始地址的指定地址中&nbsp;<br>
<br>
参数说明：[地址范围] 指定要复制内容的内存区域的起始和结束地址，或起始地址和长度。[起始地址] 指定要将 range 内容复制到该位置的起始地址。<br>     
★   N命令&nbsp;<br>    
<br>
格式：N[盘号: ] [路径] [文件名] [扩展名]<br>     
功能：定义DEBUG使用的文件。&nbsp;<br>
<br>
参数说明：[盘号: ] [路径] [文件名] [扩展名]指定文件所在的盘符，路径，文件名和扩展名。<br>     
★   O命令&nbsp;<br>    
<br>
格式：O[端口地址] [数据]<br>     
功能：发送数据（字节）到指定的输出端口。&nbsp;<br>
<br>
参数说明：[端口地址]指定要写入数据的端口地址，[数据] 指定要向[端口地址] 中写入的字节值。<br>     
★   P命令&nbsp;<br>    
<br>
格式：P[=地址] [数据]&nbsp;<br>    
功能：执行一个子程序调用指令，循环指令，中断指令或一个重复字符串指令，停止在下一条指令上。&nbsp;<br>
<br>
参数说明：[=地址] 指定第一 条要执行指令的位置。如果不指定地址，则默认地址是在 CS:IP 寄存器中指定的当前地址，[数据] 指定在将控制返回给 Debug 之前要执行的指令数，默认值为 1。<br>     
★  Q命令&nbsp;<br>    
<br>
格式：Q&nbsp;<br>
<br>
功能：退出DEBUG返回DOS。&nbsp;<br>
<br>
参数说明：无参数。<br>
★   R命令&nbsp;<br>    
<br>
格式：R[寄存器]&nbsp;<br>
功能：1. 显示单个寄存器的内容，并提供修改功能。2. 显示所有寄存器内容， 再加上字母标志位状态以及要执行的下一条指令。3. 显示8个标志位状态， 并提供修改功能。&nbsp;<br>    
<br>
参数说明：[寄存器]指定要显示其内容的寄存器名。<br>
★   S命令&nbsp;<br>    
<br>
格式：S[地址范围] [字符串]<br>     
功能：在指定的地址范围内查找给定的字符串。&nbsp;<br>
<br>
参数说明：[地址范围] 指定要搜索范围的开始和结束地址。[字符串] 指定要搜索的字节值或字符串。字符串应包括在引号中。<br>     
★   T命令&nbsp;<br>    
<br>
格式：T[=地址] [指令条数]<br>     
功能: 逐条跟踪程序的执行，每条指令执行后都将显示各寄存器的内容。&nbsp;<br>    
<br>
参数说明：[=地址] 指定第一 条要执行指令的位置。如果不指定地址，则默认地址是在 CS:IP 寄存器中指定的当前地址，[指令条数] 指定在将控制返回给 Debug 之前要执行的指令数，默认值为 1。<br>     
★   U命令&nbsp;<br>    
<br>
格式：U[起始地址]或者[地址范围]<br>
功能：将内存中的内容转换为汇编语句。&nbsp;<br>
<br>
参数说明：[起始地址]或者[地址范围]指定要反汇编代码的起始地址和结束地址，或起始地址和长度。<br>
★   W命令&nbsp;<br>    
<br>
格式：W[地址] [盘符:] [起始扇区] [扇区数]&nbsp;<br>    
功能：将内存中的数据写入磁盘中。&nbsp;<br>
<br>
参数说明：[地址]指定要写到磁盘文件的文件或部分文件的起始内存地址。如果不指定 address，Debug 程序将从 CS:100 开始。[盘符:] 指定包含目标盘的驱动器。该值是数值型：0 = A, 1 = B, 2 = C,等等。[起始扇区] 指定要写入第一个扇区的十六进制数。[扇区数] 指定要写入的扇区数。<br>     
★  XA命令 格式：XA[页面数] 功能：分配扩展内存的指定页面数 参数说明：[页面数] 指定要分配的扩展内存的 16KB 页数。 ★       XD命令 格式：XD [释放的句柄] 功能：释放指向扩展内存的句柄。 参数说明：[释放的句柄] 指定要释放的句柄。 ★       XM命令 格式：XM [要映射扩展内存的逻辑页面号] [映射到的物理页面号] [句柄] 功能：将属于指定句柄的扩展内存逻辑页映射到扩展内存的物理页。 参数说明：[要映射扩展内存的逻辑页面号]指定要映射到物理页的扩展内存的逻辑页面号。[映射到的物理页面号]指定将映射到的物理页面号。 [句柄]指定句柄。 ★       XS命令 格式：XS 功能：显示有关扩展内存状态的信息。 参数说明：无参数&nbsp;<br>    
<br>
<br>
<br>
<br>
★  A命令使用&nbsp;<br>    
<br>
说明：用于小段程序的汇编及修改目标程序，所有输入的数字均默认为十六进制，并且不需要以“h”字符结尾。用户装入内存的汇编语句是连续存放的，若没有指定地址，并且前面没有使用汇编命令，该语句被汇编到 CS:0100区域，则在它上次停止处开始汇编。&nbsp;<br>    
<br>
注意： 1.  直接在A命令下输入跳转指令时，跳转指令后应跟跳转到的语句所在内存单元的地址，不能跟标号；使用跳转指令时，可以指定跳转指令的属性：near，far。near 前缀可以缩写为 ne。如下例所示：              -a0100:0100&nbsp;<br>    
<br>
<br>
      0100:0100 jmp 102&nbsp;<br>    
<br>
      0100:0102 jmp near 105&nbsp;<br>    
<br>
0100:0105 jmp far 10a          2.  汇编语言指令所涉及到的操作数可以是字操作数也可以是字节操作数，在语句不能判别操作数的类型时，可以使用前缀 word ptr 或者前缀 byte ptr 指定操作数的类型。缩写分别是 ：wo 和 by。如下列所示：               -a0100:0100&nbsp;<br>    
<br>
      0100:0100 dec  word  ptr  [100]&nbsp;<br>    
<br>
      0100:0102 dec  wo   ptr   [100]&nbsp;<br>    
<br>
0100:0105 dec  byte  ptr  [100] 2.     在DEBUG下，应注意区分立即操作数和内存地址的操作数，使用包括在中括号 ([ ])中 的操作数表示内存地址。 3.     在DEBUG下，能够使用的伪指令仅有DB和DW两个，分别用于定义字节和字操作数，此时定义的操作数被存放在该定义指令所在的内存空间中。如下列所示（注意内存空间的变换，why?）： -a    0100:0100&nbsp;<br>    
<br>
             0100:0100 DB ‘ABCDEFG’&nbsp;<br>    
0100:0107&nbsp;<br>
<br>
★  C命令使用 说明：如果 [源地址范围]和[目的地址]中内存单元的数据相同，Debug 将不显示任何内容而直接返回到 Debug 提示符。如果有差异，Debug将按如下格式显示：       [源地址] 源地址中内容     目的地址中内容[目的地址]&nbsp;<br>    
如下列所示：&nbsp;<br>
<br>
-C CS:100 105 DS:300；（假定CS=0AF6；DS=1000） 0AF6:0100 88   00 1000:0300&nbsp;<br>    
<br>
0AF6:0101 C0   00 1000:0301&nbsp;<br>    
<br>
0AF6:0102 89   00 1000:0302&nbsp;<br>    
<br>
0AF6:0103 D8  00 1000:0303&nbsp;<br>    
<br>
0AF6:0104 65   00 1000:0304&nbsp;<br>    
<br>
0AF6:0105 66   00 1000:0305&nbsp;<br>    
<br>
★  D命令使用&nbsp;<br>    
<br>
说明：当使用 d 命令时，Debug分两个部分显示内存单元内容：左边显示内存单元中存放的十六进制数；右边显示左边的十六进制所表示的ASCII字符，所有不可打印字符用句号(.)表示。每行显示16个字节的内容，在第八和第九个字节之间有一个连字符“